package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 使用指定的构造器实例化对象
 */
public class ReflectDemo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //无论我们使用反射(获取Class对象)来获取类的构造器（Constructor),方法(Method)，还是属性(Filed),第一步永远是先获取Class对象！
        Class cls = Class.forName("reflect.Person");
        /**
         *   Constructor类
         *   获取构造器对象的三个方法：
         *   1.getConstructor(Class<?>... parameterTypes) 使用Construct类型接收，该方法仅能获取公共构造方法
         *      如果获取的是无参构造器，括号内不要写东西；如果是有参构造器，带什么类型的参数，就写入对应参数的类对象
         *      比如String.class，int.class
         *      ？表示通配符，代表不确定的任意类型
         */
        Constructor c = cls.getConstructor();//获取类对象cls的无参构造器
        Object o = c.newInstance();
        //注意获取Construct对象的根本目的一定是为了去使用newInstance()方法
        Constructor c2 = cls.getConstructor(String.class,int.class);//这里c2就是Person(String,int)这个有参构造器的对象
        Object o2 = c2.newInstance("李四",18);
        System.out.println(o2);

        /**
         *   获取构造器对象的方法：
         *   2.getDeclaredConstructor(Class<?>... parameterTypes); 是用来获取私有构造器的
         */

        /**
         *   获取构造器对象方法：
         *   3.getConstructors();
         *   该方法返回目标类所有非私有的构造函数的数组，因此需要用一个构造器类型的数组作接收。即，Constructor[] cons =
         */
    }
}
